<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
    <title>Coverage for app\models.py: 71%</title>
    <link rel="icon" sizes="32x32" href="favicon_32.png">
    <link rel="stylesheet" href="style.css" type="text/css">
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="jquery.hotkeys.js"></script>
    <script type="text/javascript" src="jquery.isonscreen.js"></script>
    <script type="text/javascript" src="coverage_html.js"></script>
    <script type="text/javascript">
        jQuery(document).ready(coverage.pyfile_ready);
    </script>
</head>
<body class="pyfile">
<div id="header">
    <div class="content">
        <h1>Coverage for <b>app\models.py</b> :
            <span class="pc_cov">71%</span>
        </h1>
        <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
        <h2 class="stats">
            192 statements &nbsp;
            <button type="button" class="run shortkey_r button_toggle_run" title="Toggle lines run">146 run</button>
            <button type="button" class="mis show_mis shortkey_m button_toggle_mis" title="Toggle lines missing">46 missing</button>
            <button type="button" class="exc show_exc shortkey_x button_toggle_exc" title="Toggle lines excluded">0 excluded</button>
            <button type="button" class="par run show_par shortkey_p button_toggle_par" title="Toggle lines partially run">6 partial</button>
        </h2>
    </div>
</div>
<div class="help_panel">
    <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
    <p class="legend">Hot-keys on this page</p>
    <div>
    <p class="keyhelp">
        <span class="key">r</span>
        <span class="key">m</span>
        <span class="key">x</span>
        <span class="key">p</span> &nbsp; toggle line displays
    </p>
    <p class="keyhelp">
        <span class="key">j</span>
        <span class="key">k</span> &nbsp; next/prev highlighted chunk
    </p>
    <p class="keyhelp">
        <span class="key">0</span> &nbsp; (zero) top of page
    </p>
    <p class="keyhelp">
        <span class="key">1</span> &nbsp; (one) first highlighted chunk
    </p>
    </div>
</div>
<div id="source">
    <p id="t1" class="pln"><span class="n"><a href="#t1">1</a></span><span class="t"><span class="com">#!/usr/bin/env python</span>&nbsp;</span><span class="r"></span></p>
    <p id="t2" class="pln"><span class="n"><a href="#t2">2</a></span><span class="t"><span class="com"># -*- coding: utf-8 -*-</span>&nbsp;</span><span class="r"></span></p>
    <p id="t3" class="pln"><span class="n"><a href="#t3">3</a></span><span class="t"><span class="com"># @Time    : 2021/3/15 10:55</span>&nbsp;</span><span class="r"></span></p>
    <p id="t4" class="pln"><span class="n"><a href="#t4">4</a></span><span class="t"><span class="com"># @Author  : Wang Yuhang</span>&nbsp;</span><span class="r"></span></p>
    <p id="t5" class="pln"><span class="n"><a href="#t5">5</a></span><span class="t"><span class="com"># @File    : models.py</span>&nbsp;</span><span class="r"></span></p>
    <p id="t6" class="pln"><span class="n"><a href="#t6">6</a></span><span class="t"><span class="com"># @Func    : &#25968;&#25454;&#24211;&#27169;&#22411;&#22788;&#29702;&#31243;&#24207;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t7" class="pln"><span class="n"><a href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t8" class="run"><span class="n"><a href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="op">.</span> <span class="key">import</span> <span class="nam">db</span>&nbsp;</span><span class="r"></span></p>
    <p id="t9" class="run"><span class="n"><a href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">werkzeug</span><span class="op">.</span><span class="nam">security</span> <span class="key">import</span> <span class="nam">generate_password_hash</span><span class="op">,</span> <span class="nam">check_password_hash</span>&nbsp;</span><span class="r"></span></p>
    <p id="t10" class="run"><span class="n"><a href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">flask_login</span> <span class="key">import</span> <span class="nam">UserMixin</span><span class="op">,</span> <span class="nam">AnonymousUserMixin</span>&nbsp;</span><span class="r"></span></p>
    <p id="t11" class="run"><span class="n"><a href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="op">.</span> <span class="key">import</span> <span class="nam">login_manager</span>&nbsp;</span><span class="r"></span></p>
    <p id="t12" class="run"><span class="n"><a href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">itsdangerous</span> <span class="key">import</span> <span class="nam">TimedJSONWebSignatureSerializer</span> <span class="key">as</span> <span class="nam">Serializer</span>&nbsp;</span><span class="r"></span></p>
    <p id="t13" class="run"><span class="n"><a href="#t13">13</a></span><span class="t"><span class="key">from</span> <span class="nam">flask</span> <span class="key">import</span> <span class="nam">current_app</span><span class="op">,</span> <span class="nam">request</span><span class="op">,</span> <span class="nam">url_for</span>&nbsp;</span><span class="r"></span></p>
    <p id="t14" class="run"><span class="n"><a href="#t14">14</a></span><span class="t"><span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
    <p id="t15" class="run"><span class="n"><a href="#t15">15</a></span><span class="t"><span class="key">import</span> <span class="nam">hashlib</span>&nbsp;</span><span class="r"></span></p>
    <p id="t16" class="run"><span class="n"><a href="#t16">16</a></span><span class="t"><span class="key">from</span> <span class="nam">markdown</span> <span class="key">import</span> <span class="nam">markdown</span>&nbsp;</span><span class="r"></span></p>
    <p id="t17" class="run"><span class="n"><a href="#t17">17</a></span><span class="t"><span class="key">import</span> <span class="nam">bleach</span>&nbsp;</span><span class="r"></span></p>
    <p id="t18" class="run"><span class="n"><a href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">app</span><span class="op">.</span><span class="nam">exceptions</span> <span class="key">import</span> <span class="nam">ValidationError</span>&nbsp;</span><span class="r"></span></p>
    <p id="t19" class="pln"><span class="n"><a href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t20" class="pln"><span class="n"><a href="#t20">20</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t21" class="run"><span class="n"><a href="#t21">21</a></span><span class="t"><span class="op">@</span><span class="nam">login_manager</span><span class="op">.</span><span class="nam">user_loader</span>  <span class="com"># &#21152;&#36733;&#29992;&#25143;&#30340;&#22238;&#35843;&#20989;&#25968;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t22" class="run"><span class="n"><a href="#t22">22</a></span><span class="t"><span class="key">def</span> <span class="nam">load_user</span><span class="op">(</span><span class="nam">user_id</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t23" class="mis show_mis"><span class="n"><a href="#t23">23</a></span><span class="t">    <span class="key">return</span> <span class="nam">User</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">user_id</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t24" class="pln"><span class="n"><a href="#t24">24</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t25" class="pln"><span class="n"><a href="#t25">25</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t26" class="run"><span class="n"><a href="#t26">26</a></span><span class="t"><span class="key">class</span> <span class="nam">Comment</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t27" class="run"><span class="n"><a href="#t27">27</a></span><span class="t">    <span class="nam">__tablename__</span> <span class="op">=</span> <span class="str">'comments'</span>&nbsp;</span><span class="r"></span></p>
    <p id="t28" class="run"><span class="n"><a href="#t28">28</a></span><span class="t">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">primary_key</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t29" class="run"><span class="n"><a href="#t29">29</a></span><span class="t">    <span class="nam">body</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Text</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t30" class="run"><span class="n"><a href="#t30">30</a></span><span class="t">    <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">DateTime</span><span class="op">,</span> <span class="nam">index</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">utcnow</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t31" class="run"><span class="n"><a href="#t31">31</a></span><span class="t">    <span class="nam">body_html</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Text</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t32" class="run"><span class="n"><a href="#t32">32</a></span><span class="t">    <span class="nam">disabled</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Boolean</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t33" class="run"><span class="n"><a href="#t33">33</a></span><span class="t">    <span class="nam">author_id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">ForeignKey</span><span class="op">(</span><span class="str">'users.id'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t34" class="run"><span class="n"><a href="#t34">34</a></span><span class="t">    <span class="nam">post_id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">ForeignKey</span><span class="op">(</span><span class="str">'posts.id'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t35" class="pln"><span class="n"><a href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t36" class="run"><span class="n"><a href="#t36">36</a></span><span class="t">    <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
    <p id="t37" class="run"><span class="n"><a href="#t37">37</a></span><span class="t">    <span class="key">def</span> <span class="nam">on_changed_body</span><span class="op">(</span><span class="nam">target</span><span class="op">,</span> <span class="nam">value</span><span class="op">,</span> <span class="nam">oldvalue</span><span class="op">,</span> <span class="nam">initiator</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t38" class="mis show_mis"><span class="n"><a href="#t38">38</a></span><span class="t">        <span class="nam">allowed_tags</span> <span class="op">=</span> <span class="op">[</span><span class="str">'a'</span><span class="op">,</span> <span class="str">'abbr'</span><span class="op">,</span> <span class="str">'acronym'</span><span class="op">,</span> <span class="str">'b'</span><span class="op">,</span> <span class="str">'blockquote'</span><span class="op">,</span> <span class="str">'code'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t39" class="pln"><span class="n"><a href="#t39">39</a></span><span class="t">                        <span class="str">'em'</span><span class="op">,</span> <span class="str">'i'</span><span class="op">,</span> <span class="str">'li'</span><span class="op">,</span> <span class="str">'ol'</span><span class="op">,</span> <span class="str">'pre'</span><span class="op">,</span> <span class="str">'strong'</span><span class="op">,</span> <span class="str">'ul'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t40" class="pln"><span class="n"><a href="#t40">40</a></span><span class="t">                        <span class="str">'h1'</span><span class="op">,</span> <span class="str">'h2'</span><span class="op">,</span> <span class="str">'h3'</span><span class="op">,</span> <span class="str">'p'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
    <p id="t41" class="mis show_mis"><span class="n"><a href="#t41">41</a></span><span class="t">        <span class="nam">target</span><span class="op">.</span><span class="nam">body_html</span> <span class="op">=</span> <span class="nam">bleach</span><span class="op">.</span><span class="nam">linkify</span><span class="op">(</span><span class="nam">bleach</span><span class="op">.</span><span class="nam">clean</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
    <p id="t42" class="pln"><span class="n"><a href="#t42">42</a></span><span class="t">            <span class="nam">markdown</span><span class="op">(</span><span class="nam">value</span><span class="op">,</span> <span class="nam">output_format</span><span class="op">=</span><span class="str">'html'</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t43" class="pln"><span class="n"><a href="#t43">43</a></span><span class="t">            <span class="nam">tags</span><span class="op">=</span><span class="nam">allowed_tags</span><span class="op">,</span> <span class="nam">strip</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t44" class="pln"><span class="n"><a href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t45" class="pln"><span class="n"><a href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t46" class="run"><span class="n"><a href="#t46">46</a></span><span class="t"><span class="key">class</span> <span class="nam">Follow</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t47" class="run"><span class="n"><a href="#t47">47</a></span><span class="t">    <span class="nam">__tablename__</span> <span class="op">=</span> <span class="str">'follows'</span>&nbsp;</span><span class="r"></span></p>
    <p id="t48" class="run"><span class="n"><a href="#t48">48</a></span><span class="t">    <span class="nam">follower_id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">ForeignKey</span><span class="op">(</span><span class="str">'users.id'</span><span class="op">)</span><span class="op">,</span> <span class="nam">primary_key</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>  <span class="com"># &#20851;&#27880;&#32773;&#30340;id</span>&nbsp;</span><span class="r"></span></p>
    <p id="t49" class="run"><span class="n"><a href="#t49">49</a></span><span class="t">    <span class="nam">followed_id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">ForeignKey</span><span class="op">(</span><span class="str">'users.id'</span><span class="op">)</span><span class="op">,</span> <span class="nam">primary_key</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>  <span class="com"># &#34987;&#20851;&#27880;&#32773;&#30340;id</span>&nbsp;</span><span class="r"></span></p>
    <p id="t50" class="run"><span class="n"><a href="#t50">50</a></span><span class="t">    <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">DateTime</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">utcnow</span><span class="op">)</span>                       <span class="com"># &#20851;&#27880;&#30340;&#26102;&#38388;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t51" class="pln"><span class="n"><a href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t52" class="pln"><span class="n"><a href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t53" class="run"><span class="n"><a href="#t53">53</a></span><span class="t"><span class="key">class</span> <span class="nam">Permission</span><span class="op">:</span>               <span class="com"># &#19981;&#21516;&#30340;&#26435;&#38480;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t54" class="run"><span class="n"><a href="#t54">54</a></span><span class="t">    <span class="nam">FOLLOW</span> <span class="op">=</span> <span class="num">0x01</span>               <span class="com"># &#20851;&#27880;&#20854;&#20182;&#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t55" class="run"><span class="n"><a href="#t55">55</a></span><span class="t">    <span class="nam">COMMENT</span> <span class="op">=</span> <span class="num">0x02</span>              <span class="com"># &#21487;&#22312;&#25991;&#31456;&#20013;&#21457;&#24067;&#35780;&#35770;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t56" class="run"><span class="n"><a href="#t56">56</a></span><span class="t">    <span class="nam">WRITE_ARTICLES</span> <span class="op">=</span> <span class="num">0x04</span>       <span class="com"># &#20889;&#25991;&#31456;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t57" class="run"><span class="n"><a href="#t57">57</a></span><span class="t">    <span class="nam">MODERATE_COMMENTS</span> <span class="op">=</span> <span class="num">0x08</span>    <span class="com"># &#31649;&#29702;&#20182;&#20154;&#30340;&#35780;&#35770;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t58" class="run"><span class="n"><a href="#t58">58</a></span><span class="t">    <span class="nam">ADMINISTER</span> <span class="op">=</span> <span class="num">0x80</span>           <span class="com"># &#31649;&#29702;&#32593;&#31449;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t59" class="pln"><span class="n"><a href="#t59">59</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t60" class="pln"><span class="n"><a href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t61" class="run"><span class="n"><a href="#t61">61</a></span><span class="t"><span class="key">class</span> <span class="nam">Role</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t62" class="run"><span class="n"><a href="#t62">62</a></span><span class="t">    <span class="nam">__tablename__</span> <span class="op">=</span> <span class="str">'roles'</span>&nbsp;</span><span class="r"></span></p>
    <p id="t63" class="run"><span class="n"><a href="#t63">63</a></span><span class="t">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">primary_key</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t64" class="run"><span class="n"><a href="#t64">64</a></span><span class="t">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">64</span><span class="op">)</span><span class="op">,</span> <span class="nam">unique</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t65" class="run"><span class="n"><a href="#t65">65</a></span><span class="t">    <span class="nam">default</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Boolean</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="key">False</span><span class="op">,</span> <span class="nam">index</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t66" class="run"><span class="n"><a href="#t66">66</a></span><span class="t">    <span class="nam">permissions</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t67" class="run"><span class="n"><a href="#t67">67</a></span><span class="t">    <span class="nam">users</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">relationship</span><span class="op">(</span><span class="str">'User'</span><span class="op">,</span> <span class="nam">backref</span><span class="op">=</span><span class="str">'role'</span><span class="op">,</span> <span class="nam">lazy</span><span class="op">=</span><span class="str">'dynamic'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t68" class="pln"><span class="n"><a href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t69" class="run"><span class="n"><a href="#t69">69</a></span><span class="t">    <span class="key">def</span> <span class="nam">__repr__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t70" class="mis show_mis"><span class="n"><a href="#t70">70</a></span><span class="t">        <span class="key">return</span> <span class="str">'&lt;Role %r>'</span> <span class="op">%</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span>&nbsp;</span><span class="r"></span></p>
    <p id="t71" class="pln"><span class="n"><a href="#t71">71</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t72" class="run"><span class="n"><a href="#t72">72</a></span><span class="t">    <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
    <p id="t73" class="run"><span class="n"><a href="#t73">73</a></span><span class="t">    <span class="key">def</span> <span class="nam">insert_roles</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t74" class="run"><span class="n"><a href="#t74">74</a></span><span class="t">        <span class="nam">roles</span> <span class="op">=</span> <span class="op">{</span>                                                   <span class="com"># &#20855;&#26377;&#19981;&#21516;&#26435;&#38480;&#32452;&#21512;&#30340;&#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t75" class="pln"><span class="n"><a href="#t75">75</a></span><span class="t">            <span class="str">'User'</span><span class="op">:</span> <span class="op">(</span><span class="nam">Permission</span><span class="op">.</span><span class="nam">FOLLOW</span> <span class="op">|</span>&nbsp;</span><span class="r"></span></p>
    <p id="t76" class="pln"><span class="n"><a href="#t76">76</a></span><span class="t">                     <span class="nam">Permission</span><span class="op">.</span><span class="nam">COMMENT</span> <span class="op">|</span>&nbsp;</span><span class="r"></span></p>
    <p id="t77" class="pln"><span class="n"><a href="#t77">77</a></span><span class="t">                     <span class="nam">Permission</span><span class="op">.</span><span class="nam">WRITE_ARTICLES</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span><span class="op">,</span>             <span class="com"># &#40664;&#35748;&#35282;&#33394;&#26159;User</span>&nbsp;</span><span class="r"></span></p>
    <p id="t78" class="pln"><span class="n"><a href="#t78">78</a></span><span class="t">            <span class="str">'Moderator'</span><span class="op">:</span> <span class="op">(</span><span class="nam">Permission</span><span class="op">.</span><span class="nam">FOLLOW</span> <span class="op">|</span>&nbsp;</span><span class="r"></span></p>
    <p id="t79" class="pln"><span class="n"><a href="#t79">79</a></span><span class="t">                          <span class="nam">Permission</span><span class="op">.</span><span class="nam">COMMENT</span> <span class="op">|</span>&nbsp;</span><span class="r"></span></p>
    <p id="t80" class="pln"><span class="n"><a href="#t80">80</a></span><span class="t">                          <span class="nam">Permission</span><span class="op">.</span><span class="nam">WRITE_ARTICLES</span> <span class="op">|</span>&nbsp;</span><span class="r"></span></p>
    <p id="t81" class="pln"><span class="n"><a href="#t81">81</a></span><span class="t">                          <span class="nam">Permission</span><span class="op">.</span><span class="nam">MODERATE_COMMENTS</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t82" class="pln"><span class="n"><a href="#t82">82</a></span><span class="t">            <span class="str">'Administrator'</span><span class="op">:</span> <span class="op">(</span><span class="num">0xff</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t83" class="pln"><span class="n"><a href="#t83">83</a></span><span class="t">        <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
    <p id="t84" class="run"><span class="n"><a href="#t84">84</a></span><span class="t">        <span class="key">for</span> <span class="nam">r</span> <span class="key">in</span> <span class="nam">roles</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t85" class="run"><span class="n"><a href="#t85">85</a></span><span class="t">            <span class="nam">role</span> <span class="op">=</span> <span class="nam">Role</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">r</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t86" class="par run show_par"><span class="n"><a href="#t86">86</a></span><span class="t">            <span class="key">if</span> <span class="nam">role</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"><span class="annotate short">86&#x202F;&#x219B;&#x202F;88</span><span class="annotate long">line 86 didn't jump to line 88, because the condition on line 86 was never false</span></span></p>
    <p id="t87" class="run"><span class="n"><a href="#t87">87</a></span><span class="t">                <span class="nam">role</span> <span class="op">=</span> <span class="nam">Role</span><span class="op">(</span><span class="nam">name</span><span class="op">=</span><span class="nam">r</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t88" class="run"><span class="n"><a href="#t88">88</a></span><span class="t">            <span class="nam">role</span><span class="op">.</span><span class="nam">permissions</span> <span class="op">=</span> <span class="nam">roles</span><span class="op">[</span><span class="nam">r</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
    <p id="t89" class="run"><span class="n"><a href="#t89">89</a></span><span class="t">            <span class="nam">role</span><span class="op">.</span><span class="nam">default</span> <span class="op">=</span> <span class="nam">roles</span><span class="op">[</span><span class="nam">r</span><span class="op">]</span><span class="op">[</span><span class="num">1</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
    <p id="t90" class="run"><span class="n"><a href="#t90">90</a></span><span class="t">            <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">role</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t91" class="run"><span class="n"><a href="#t91">91</a></span><span class="t">        <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t92" class="pln"><span class="n"><a href="#t92">92</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t93" class="pln"><span class="n"><a href="#t93">93</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t94" class="run"><span class="n"><a href="#t94">94</a></span><span class="t"><span class="key">class</span> <span class="nam">User</span><span class="op">(</span><span class="nam">UserMixin</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t95" class="run"><span class="n"><a href="#t95">95</a></span><span class="t">    <span class="nam">__tablename__</span> <span class="op">=</span> <span class="str">'users'</span>&nbsp;</span><span class="r"></span></p>
    <p id="t96" class="run"><span class="n"><a href="#t96">96</a></span><span class="t">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">primary_key</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>                                <span class="com"># id</span>&nbsp;</span><span class="r"></span></p>
    <p id="t97" class="run"><span class="n"><a href="#t97">97</a></span><span class="t">    <span class="nam">email</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">64</span><span class="op">)</span><span class="op">,</span> <span class="nam">unique</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">index</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>                   <span class="com"># &#37038;&#31665;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t98" class="run"><span class="n"><a href="#t98">98</a></span><span class="t">    <span class="nam">username</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">64</span><span class="op">)</span><span class="op">,</span> <span class="nam">unique</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">index</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>                <span class="com"># &#29992;&#25143;&#21517;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t99" class="run"><span class="n"><a href="#t99">99</a></span><span class="t">    <span class="nam">role_id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">ForeignKey</span><span class="op">(</span><span class="str">'roles.id'</span><span class="op">)</span><span class="op">)</span>                  <span class="com"># &#35282;&#33394;id</span>&nbsp;</span><span class="r"></span></p>
    <p id="t100" class="run"><span class="n"><a href="#t100">100</a></span><span class="t">    <span class="nam">password_hash</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">128</span><span class="op">)</span><span class="op">)</span>                                   <span class="com"># &#23494;&#30721;&#30340;&#21704;&#24076;&#20540;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t101" class="run"><span class="n"><a href="#t101">101</a></span><span class="t">    <span class="nam">confirmed</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Boolean</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>                            <span class="com"># &#26159;&#21542;&#39564;&#35777;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t102" class="run"><span class="n"><a href="#t102">102</a></span><span class="t">    <span class="nam">name</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">64</span><span class="op">)</span><span class="op">)</span>                                             <span class="com"># &#22995;&#21517;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t103" class="run"><span class="n"><a href="#t103">103</a></span><span class="t">    <span class="nam">location</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">64</span><span class="op">)</span><span class="op">)</span>                                         <span class="com"># &#20301;&#32622;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t104" class="run"><span class="n"><a href="#t104">104</a></span><span class="t">    <span class="nam">about_me</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Text</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>                                             <span class="com"># &#33258;&#25105;&#20171;&#32461;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t105" class="run"><span class="n"><a href="#t105">105</a></span><span class="t">    <span class="nam">member_since</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">DateTime</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">utcnow</span><span class="op">)</span>            <span class="com"># &#27880;&#20876;&#26085;&#26399;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t106" class="run"><span class="n"><a href="#t106">106</a></span><span class="t">    <span class="nam">last_seen</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">DateTime</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">utcnow</span><span class="op">)</span>               <span class="com"># &#26368;&#21518;&#35775;&#38382;&#26085;&#26399;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t107" class="run"><span class="n"><a href="#t107">107</a></span><span class="t">    <span class="nam">avatar_hash</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">String</span><span class="op">(</span><span class="num">32</span><span class="op">)</span><span class="op">)</span>                                      <span class="com"># &#22836;&#20687;URL&#20013;&#29992;&#21040;&#30340;hash&#20540;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t108" class="run"><span class="n"><a href="#t108">108</a></span><span class="t">    <span class="nam">posts</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">relationship</span><span class="op">(</span><span class="str">'Post'</span><span class="op">,</span> <span class="nam">backref</span><span class="op">=</span><span class="str">'author'</span><span class="op">,</span> <span class="nam">lazy</span><span class="op">=</span><span class="str">'dynamic'</span><span class="op">)</span>           <span class="com"># &#25991;&#31456;&#20869;&#23481;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t109" class="run"><span class="n"><a href="#t109">109</a></span><span class="t">    <span class="nam">followed</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">relationship</span><span class="op">(</span><span class="str">'Follow'</span><span class="op">,</span>                                        <span class="com"># &#20851;&#27880;&#30340;&#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t110" class="pln"><span class="n"><a href="#t110">110</a></span><span class="t">                               <span class="nam">foreign_keys</span><span class="op">=</span><span class="op">[</span><span class="nam">Follow</span><span class="op">.</span><span class="nam">follower_id</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t111" class="pln"><span class="n"><a href="#t111">111</a></span><span class="t">                               <span class="nam">backref</span><span class="op">=</span><span class="nam">db</span><span class="op">.</span><span class="nam">backref</span><span class="op">(</span><span class="str">'follower'</span><span class="op">,</span> <span class="nam">lazy</span><span class="op">=</span><span class="str">'joined'</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t112" class="pln"><span class="n"><a href="#t112">112</a></span><span class="t">                               <span class="nam">lazy</span><span class="op">=</span><span class="str">'dynamic'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t113" class="pln"><span class="n"><a href="#t113">113</a></span><span class="t">                               <span class="nam">cascade</span><span class="op">=</span><span class="str">'all,delete-orphan'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t114" class="run"><span class="n"><a href="#t114">114</a></span><span class="t">    <span class="nam">followers</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">relationship</span><span class="op">(</span><span class="str">'Follow'</span><span class="op">,</span>                                       <span class="com"># &#31881;&#19997;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t115" class="pln"><span class="n"><a href="#t115">115</a></span><span class="t">                                <span class="nam">foreign_keys</span><span class="op">=</span><span class="op">[</span><span class="nam">Follow</span><span class="op">.</span><span class="nam">followed_id</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t116" class="pln"><span class="n"><a href="#t116">116</a></span><span class="t">                                <span class="nam">backref</span><span class="op">=</span><span class="nam">db</span><span class="op">.</span><span class="nam">backref</span><span class="op">(</span><span class="str">'followed'</span><span class="op">,</span> <span class="nam">lazy</span><span class="op">=</span><span class="str">'joined'</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t117" class="pln"><span class="n"><a href="#t117">117</a></span><span class="t">                                <span class="nam">lazy</span><span class="op">=</span><span class="str">'dynamic'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t118" class="pln"><span class="n"><a href="#t118">118</a></span><span class="t">                                <span class="nam">cascade</span><span class="op">=</span><span class="str">'all,delete-orphan'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t119" class="run"><span class="n"><a href="#t119">119</a></span><span class="t">    <span class="nam">comments</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">relationship</span><span class="op">(</span><span class="str">'Comment'</span><span class="op">,</span> <span class="nam">backref</span><span class="op">=</span><span class="str">'author'</span><span class="op">,</span> <span class="nam">lazy</span><span class="op">=</span><span class="str">'dynamic'</span><span class="op">)</span>     <span class="com"># &#35780;&#35770;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t120" class="pln"><span class="n"><a href="#t120">120</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t121" class="run"><span class="n"><a href="#t121">121</a></span><span class="t">    <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
    <p id="t122" class="run"><span class="n"><a href="#t122">122</a></span><span class="t">    <span class="key">def</span> <span class="nam">add_self_follows</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>  <span class="com"># &#29992;&#25143;&#33258;&#24049;&#20851;&#27880;&#33258;&#24049;&#30340;&#26041;&#27861;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t123" class="mis show_mis"><span class="n"><a href="#t123">123</a></span><span class="t">        <span class="key">for</span> <span class="nam">user</span> <span class="key">in</span> <span class="nam">User</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">all</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t124" class="mis show_mis"><span class="n"><a href="#t124">124</a></span><span class="t">            <span class="key">if</span> <span class="key">not</span> <span class="nam">user</span><span class="op">.</span><span class="nam">is_following</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t125" class="mis show_mis"><span class="n"><a href="#t125">125</a></span><span class="t">                <span class="nam">user</span><span class="op">.</span><span class="nam">follow</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t126" class="mis show_mis"><span class="n"><a href="#t126">126</a></span><span class="t">                <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t127" class="mis show_mis"><span class="n"><a href="#t127">127</a></span><span class="t">                <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">commit</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t128" class="pln"><span class="n"><a href="#t128">128</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t129" class="run"><span class="n"><a href="#t129">129</a></span><span class="t">    <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t130" class="run"><span class="n"><a href="#t130">130</a></span><span class="t">        <span class="nam">super</span><span class="op">(</span><span class="nam">User</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span>                                    <span class="com"># &#35843;&#29992;&#22522;&#31867;&#26500;&#36896;&#20989;&#25968;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t131" class="par run show_par"><span class="n"><a href="#t131">131</a></span><span class="t">        <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">role</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"><span class="annotate short">131&#x202F;&#x219B;&#x202F;136</span><span class="annotate long">line 131 didn't jump to line 136, because the condition on line 131 was never false</span></span></p>
    <p id="t132" class="par run show_par"><span class="n"><a href="#t132">132</a></span><span class="t">            <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">email</span> <span class="op">==</span> <span class="nam">current_app</span><span class="op">.</span><span class="nam">config</span><span class="op">[</span><span class="str">'FLASKY_ADMIN'</span><span class="op">]</span><span class="op">:</span>                <span class="com"># &#31649;&#29702;&#21592;</span>&nbsp;</span><span class="r"><span class="annotate short">132&#x202F;&#x219B;&#x202F;133</span><span class="annotate long">line 132 didn't jump to line 133, because the condition on line 132 was never true</span></span></p>
    <p id="t133" class="mis show_mis"><span class="n"><a href="#t133">133</a></span><span class="t">                <span class="nam">self</span><span class="op">.</span><span class="nam">role</span> <span class="op">=</span> <span class="nam">Role</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">permissions</span><span class="op">=</span><span class="num">0xff</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t134" class="par run show_par"><span class="n"><a href="#t134">134</a></span><span class="t">            <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">role</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"><span class="annotate short">134&#x202F;&#x219B;&#x202F;136</span><span class="annotate long">line 134 didn't jump to line 136, because the condition on line 134 was never false</span></span></p>
    <p id="t135" class="run"><span class="n"><a href="#t135">135</a></span><span class="t">                <span class="nam">self</span><span class="op">.</span><span class="nam">role</span> <span class="op">=</span> <span class="nam">Role</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">default</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span>          <span class="com"># &#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t136" class="run"><span class="n"><a href="#t136">136</a></span><span class="t">        <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">email</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">self</span><span class="op">.</span><span class="nam">avatar_hash</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t137" class="run"><span class="n"><a href="#t137">137</a></span><span class="t">            <span class="nam">self</span><span class="op">.</span><span class="nam">avatar_hash</span> <span class="op">=</span> <span class="nam">hashlib</span><span class="op">.</span><span class="nam">md5</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">email</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span><span class="op">)</span><span class="op">.</span><span class="nam">hexdigest</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t138" class="run"><span class="n"><a href="#t138">138</a></span><span class="t">        <span class="nam">self</span><span class="op">.</span><span class="nam">follow</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span>                                                       <span class="com"># &#33258;&#24049;&#20851;&#27880;&#33258;&#24049;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t139" class="pln"><span class="n"><a href="#t139">139</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t140" class="run"><span class="n"><a href="#t140">140</a></span><span class="t">    <span class="op">@</span><span class="nam">property</span>  <span class="com"># &#23450;&#20041;&#20026;&#26041;&#27861;&#65292;&#35843;&#29992;&#26102;&#26080;&#38656;&#20351;&#29992;()</span>&nbsp;</span><span class="r"></span></p>
    <p id="t141" class="run"><span class="n"><a href="#t141">141</a></span><span class="t">    <span class="key">def</span> <span class="nam">followed_posts</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t142" class="pln"><span class="n"><a href="#t142">142</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t143" class="pln"><span class="n"><a href="#t143">143</a></span><span class="t"><span class="str">        &#33719;&#21462;&#25152;&#20851;&#27880;&#29992;&#25143;&#30340;&#25991;&#31456;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t144" class="pln"><span class="n"><a href="#t144">144</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t145" class="pln"><span class="n"><a href="#t145">145</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t146" class="mis show_mis"><span class="n"><a href="#t146">146</a></span><span class="t">        <span class="key">return</span> <span class="nam">Post</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">Follow</span><span class="op">,</span> <span class="nam">Follow</span><span class="op">.</span><span class="nam">followed_id</span> <span class="op">==</span> <span class="nam">Post</span><span class="op">.</span><span class="nam">author_id</span><span class="op">)</span><span class="op">.</span><span class="nam">filter</span><span class="op">(</span><span class="nam">Follow</span><span class="op">.</span><span class="nam">follower_id</span> <span class="op">==</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t147" class="pln"><span class="n"><a href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t148" class="run"><span class="n"><a href="#t148">148</a></span><span class="t">    <span class="key">def</span> <span class="nam">follow</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t149" class="pln"><span class="n"><a href="#t149">149</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t150" class="pln"><span class="n"><a href="#t150">150</a></span><span class="t"><span class="str">        &#33258;&#24049;&#20851;&#27880;&#26576;&#20010;&#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t151" class="pln"><span class="n"><a href="#t151">151</a></span><span class="t"><span class="str">        :param user:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t152" class="pln"><span class="n"><a href="#t152">152</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t153" class="pln"><span class="n"><a href="#t153">153</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t154" class="par run show_par"><span class="n"><a href="#t154">154</a></span><span class="t">        <span class="key">if</span> <span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_following</span><span class="op">(</span><span class="nam">user</span><span class="op">)</span><span class="op">:</span>                 <span class="com"># &#20808;&#30475;&#26159;&#19981;&#26159;&#24050;&#32463;&#20851;&#27880;&#20102;&#65292;&#27809;&#20851;&#27880;&#30340;&#35805;</span>&nbsp;</span><span class="r"><span class="annotate short">154&#x202F;&#x219B;&#x202F;exit</span><span class="annotate long">line 154 didn't return from function 'follow', because the condition on line 154 was never false</span></span></p>
    <p id="t155" class="run"><span class="n"><a href="#t155">155</a></span><span class="t">            <span class="nam">f</span> <span class="op">=</span> <span class="nam">Follow</span><span class="op">(</span><span class="nam">follower</span><span class="op">=</span><span class="nam">self</span><span class="op">,</span> <span class="nam">followed</span><span class="op">=</span><span class="nam">user</span><span class="op">)</span>    <span class="com"># &#33258;&#24049;&#26159;&#20851;&#27880;&#32773;&#65292;user&#26159;&#34987;&#20851;&#27880;&#32773;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t156" class="run"><span class="n"><a href="#t156">156</a></span><span class="t">            <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">f</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t157" class="pln"><span class="n"><a href="#t157">157</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t158" class="run"><span class="n"><a href="#t158">158</a></span><span class="t">    <span class="key">def</span> <span class="nam">unfollow</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t159" class="pln"><span class="n"><a href="#t159">159</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t160" class="pln"><span class="n"><a href="#t160">160</a></span><span class="t"><span class="str">        &#33258;&#24049;&#21462;&#28040;&#20851;&#27880;&#26576;&#20010;&#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t161" class="pln"><span class="n"><a href="#t161">161</a></span><span class="t"><span class="str">        :param user:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t162" class="pln"><span class="n"><a href="#t162">162</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t163" class="pln"><span class="n"><a href="#t163">163</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t164" class="mis show_mis"><span class="n"><a href="#t164">164</a></span><span class="t">        <span class="nam">f</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">followed</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">followed_id</span><span class="op">=</span><span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span>  <span class="com"># &#30475;&#30475;&#33258;&#24049;&#30340;followed&#20013;&#26159;&#21542;&#26377;user</span>&nbsp;</span><span class="r"></span></p>
    <p id="t165" class="mis show_mis"><span class="n"><a href="#t165">165</a></span><span class="t">        <span class="key">if</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t166" class="mis show_mis"><span class="n"><a href="#t166">166</a></span><span class="t">            <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">delete</span><span class="op">(</span><span class="nam">f</span><span class="op">)</span>                                  <span class="com"># &#26377;&#30340;&#35805;&#65292;&#21024;&#38500;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t167" class="pln"><span class="n"><a href="#t167">167</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t168" class="run"><span class="n"><a href="#t168">168</a></span><span class="t">    <span class="key">def</span> <span class="nam">is_following</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t169" class="pln"><span class="n"><a href="#t169">169</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t170" class="pln"><span class="n"><a href="#t170">170</a></span><span class="t"><span class="str">        &#26816;&#26597;&#33258;&#24049;&#26159;&#21542;&#24050;&#32463;&#20851;&#27880;&#20102;&#26576;&#20010;&#29992;&#25143;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t171" class="pln"><span class="n"><a href="#t171">171</a></span><span class="t"><span class="str">        :param user:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t172" class="pln"><span class="n"><a href="#t172">172</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t173" class="pln"><span class="n"><a href="#t173">173</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t174" class="par run show_par"><span class="n"><a href="#t174">174</a></span><span class="t">        <span class="key">if</span> <span class="nam">user</span><span class="op">.</span><span class="nam">id</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"><span class="annotate short">174&#x202F;&#x219B;&#x202F;176</span><span class="annotate long">line 174 didn't jump to line 176, because the condition on line 174 was never false</span></span></p>
    <p id="t175" class="run"><span class="n"><a href="#t175">175</a></span><span class="t">            <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
    <p id="t176" class="mis show_mis"><span class="n"><a href="#t176">176</a></span><span class="t">        <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">followed</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">followed_id</span><span class="op">=</span><span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span>  <span class="com"># &#26597;&#35810;&#29992;&#25143;id&#26159;&#21542;&#22312;followed_id&#20013;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t177" class="pln"><span class="n"><a href="#t177">177</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t178" class="run"><span class="n"><a href="#t178">178</a></span><span class="t">    <span class="key">def</span> <span class="nam">is_followed_by</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">user</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t179" class="pln"><span class="n"><a href="#t179">179</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t180" class="pln"><span class="n"><a href="#t180">180</a></span><span class="t"><span class="str">        &#26816;&#26597;&#33258;&#24049;&#26159;&#21542;&#24050;&#32463;&#34987;&#26576;&#20010;&#29992;&#25143;&#20851;&#27880;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t181" class="pln"><span class="n"><a href="#t181">181</a></span><span class="t"><span class="str">        :param user:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t182" class="pln"><span class="n"><a href="#t182">182</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t183" class="pln"><span class="n"><a href="#t183">183</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t184" class="mis show_mis"><span class="n"><a href="#t184">184</a></span><span class="t">        <span class="key">if</span> <span class="nam">user</span><span class="op">.</span><span class="nam">id</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t185" class="mis show_mis"><span class="n"><a href="#t185">185</a></span><span class="t">            <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
    <p id="t186" class="mis show_mis"><span class="n"><a href="#t186">186</a></span><span class="t">        <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">followers</span><span class="op">.</span><span class="nam">filter_by</span><span class="op">(</span><span class="nam">follower_id</span><span class="op">=</span><span class="nam">user</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">.</span><span class="nam">first</span><span class="op">(</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span>  <span class="com"># &#30475;&#33258;&#24049;&#30340;&#20851;&#27880;&#32773;&#21015;&#34920;&#20013;&#26159;&#21542;&#26377;user</span>&nbsp;</span><span class="r"></span></p>
    <p id="t187" class="pln"><span class="n"><a href="#t187">187</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t188" class="run"><span class="n"><a href="#t188">188</a></span><span class="t">    <span class="op">@</span><span class="nam">property</span>  <span class="com"># &#20462;&#39280;&#26041;&#27861;&#65292;&#35753;&#26041;&#27861;&#21487;&#20197;&#20687;&#23646;&#24615;&#19968;&#26679;&#34987;&#35775;&#38382;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t189" class="run"><span class="n"><a href="#t189">189</a></span><span class="t">    <span class="key">def</span> <span class="nam">password</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>  <span class="com"># &#35797;&#22270;&#35835;&#21462;&#21407;&#26469;&#30340;&#23494;&#30721;&#26102;&#65292;&#23494;&#30721;&#30340;&#25955;&#21015;&#20540;&#19981;&#21487;&#35835;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t190" class="run"><span class="n"><a href="#t190">190</a></span><span class="t">        <span class="key">raise</span> <span class="nam">AttributeError</span><span class="op">(</span><span class="str">'&#23494;&#30721;&#19981;&#21487;&#35835;&#65281;'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t191" class="pln"><span class="n"><a href="#t191">191</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t192" class="run"><span class="n"><a href="#t192">192</a></span><span class="t">    <span class="op">@</span><span class="nam">password</span><span class="op">.</span><span class="nam">setter</span>  <span class="com"># &#20351;password&#23646;&#24615;&#22312;&#23384;&#20837;&#21069;&#36827;&#34892;&#39044;&#22788;&#29702;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t193" class="run"><span class="n"><a href="#t193">193</a></span><span class="t">    <span class="key">def</span> <span class="nam">password</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">password</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t194" class="run"><span class="n"><a href="#t194">194</a></span><span class="t">        <span class="nam">self</span><span class="op">.</span><span class="nam">password_hash</span> <span class="op">=</span> <span class="nam">generate_password_hash</span><span class="op">(</span><span class="nam">password</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t195" class="pln"><span class="n"><a href="#t195">195</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t196" class="run"><span class="n"><a href="#t196">196</a></span><span class="t">    <span class="key">def</span> <span class="nam">verify_password</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">password</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t197" class="run"><span class="n"><a href="#t197">197</a></span><span class="t">        <span class="key">return</span> <span class="nam">check_password_hash</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">password_hash</span><span class="op">,</span> <span class="nam">password</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t198" class="pln"><span class="n"><a href="#t198">198</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t199" class="run"><span class="n"><a href="#t199">199</a></span><span class="t">    <span class="key">def</span> <span class="nam">generate_confirmation_token</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">expiration</span><span class="op">=</span><span class="num">3600</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t200" class="run"><span class="n"><a href="#t200">200</a></span><span class="t">        <span class="nam">s</span> <span class="op">=</span> <span class="nam">Serializer</span><span class="op">(</span><span class="nam">current_app</span><span class="op">.</span><span class="nam">config</span><span class="op">[</span><span class="str">'SECRET_KEY'</span><span class="op">]</span><span class="op">,</span> <span class="nam">expiration</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t201" class="run"><span class="n"><a href="#t201">201</a></span><span class="t">        <span class="key">return</span> <span class="nam">s</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="op">{</span><span class="str">'confirm'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t202" class="pln"><span class="n"><a href="#t202">202</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t203" class="run"><span class="n"><a href="#t203">203</a></span><span class="t">    <span class="key">def</span> <span class="nam">confirm</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">token</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t204" class="run"><span class="n"><a href="#t204">204</a></span><span class="t">        <span class="nam">s</span> <span class="op">=</span> <span class="nam">Serializer</span><span class="op">(</span><span class="nam">current_app</span><span class="op">.</span><span class="nam">config</span><span class="op">[</span><span class="str">'SECRET_KEY'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t205" class="run"><span class="n"><a href="#t205">205</a></span><span class="t">        <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t206" class="run"><span class="n"><a href="#t206">206</a></span><span class="t">            <span class="nam">data</span> <span class="op">=</span> <span class="nam">s</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">token</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t207" class="run"><span class="n"><a href="#t207">207</a></span><span class="t">        <span class="key">except</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t208" class="run"><span class="n"><a href="#t208">208</a></span><span class="t">            <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
    <p id="t209" class="run"><span class="n"><a href="#t209">209</a></span><span class="t">        <span class="key">if</span> <span class="nam">data</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'confirm'</span><span class="op">)</span> <span class="op">!=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t210" class="run"><span class="n"><a href="#t210">210</a></span><span class="t">            <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
    <p id="t211" class="run"><span class="n"><a href="#t211">211</a></span><span class="t">        <span class="nam">self</span><span class="op">.</span><span class="nam">confirmed</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
    <p id="t212" class="run"><span class="n"><a href="#t212">212</a></span><span class="t">        <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t213" class="run"><span class="n"><a href="#t213">213</a></span><span class="t">        <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
    <p id="t214" class="pln"><span class="n"><a href="#t214">214</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t215" class="run"><span class="n"><a href="#t215">215</a></span><span class="t">    <span class="key">def</span> <span class="nam">__repr__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t216" class="mis show_mis"><span class="n"><a href="#t216">216</a></span><span class="t">        <span class="key">return</span> <span class="str">'&lt;User %r>'</span> <span class="op">%</span> <span class="nam">self</span><span class="op">.</span><span class="nam">username</span>&nbsp;</span><span class="r"></span></p>
    <p id="t217" class="pln"><span class="n"><a href="#t217">217</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t218" class="run"><span class="n"><a href="#t218">218</a></span><span class="t">    <span class="key">def</span> <span class="nam">can</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">permissions</span><span class="op">)</span><span class="op">:</span>  <span class="com"># &#35831;&#27714;&#35282;&#33394;&#21644;&#36171;&#20104;&#35282;&#33394;&#36827;&#34892;&#20301;&#19982;&#25805;&#20316;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t219" class="run"><span class="n"><a href="#t219">219</a></span><span class="t">        <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">role</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
    <p id="t220" class="pln"><span class="n"><a href="#t220">220</a></span><span class="t">               <span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">role</span><span class="op">.</span><span class="nam">permissions</span> <span class="op">&amp;</span> <span class="nam">permissions</span><span class="op">)</span> <span class="op">==</span> <span class="nam">permissions</span>&nbsp;</span><span class="r"></span></p>
    <p id="t221" class="pln"><span class="n"><a href="#t221">221</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t222" class="run"><span class="n"><a href="#t222">222</a></span><span class="t">    <span class="key">def</span> <span class="nam">is_administrator</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>  <span class="com"># &#26816;&#26597;&#31649;&#29702;&#21592;&#35282;&#33394;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t223" class="mis show_mis"><span class="n"><a href="#t223">223</a></span><span class="t">        <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">can</span><span class="op">(</span><span class="nam">Permission</span><span class="op">.</span><span class="nam">ADMINISTER</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t224" class="pln"><span class="n"><a href="#t224">224</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t225" class="run"><span class="n"><a href="#t225">225</a></span><span class="t">    <span class="key">def</span> <span class="nam">ping</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t226" class="pln"><span class="n"><a href="#t226">226</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t227" class="pln"><span class="n"><a href="#t227">227</a></span><span class="t"><span class="str">        &#21047;&#26032;&#29992;&#25143;&#30340;&#26368;&#21518;&#35775;&#38382;&#26102;&#38388;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t228" class="pln"><span class="n"><a href="#t228">228</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t229" class="pln"><span class="n"><a href="#t229">229</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t230" class="mis show_mis"><span class="n"><a href="#t230">230</a></span><span class="t">        <span class="nam">self</span><span class="op">.</span><span class="nam">last_seen</span> <span class="op">=</span> <span class="nam">datetime</span><span class="op">.</span><span class="nam">utcnow</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t231" class="mis show_mis"><span class="n"><a href="#t231">231</a></span><span class="t">        <span class="nam">db</span><span class="op">.</span><span class="nam">session</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t232" class="pln"><span class="n"><a href="#t232">232</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t233" class="run"><span class="n"><a href="#t233">233</a></span><span class="t">    <span class="key">def</span> <span class="nam">gravatar</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">size</span><span class="op">=</span><span class="num">100</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="str">'identicon'</span><span class="op">,</span> <span class="nam">rating</span><span class="op">=</span><span class="str">'g'</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t234" class="mis show_mis"><span class="n"><a href="#t234">234</a></span><span class="t">        <span class="key">if</span> <span class="nam">request</span><span class="op">.</span><span class="nam">is_secure</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t235" class="mis show_mis"><span class="n"><a href="#t235">235</a></span><span class="t">            <span class="nam">url</span> <span class="op">=</span> <span class="str">'https://gravatar.loli.net/avatar/'</span>  <span class="com"># gravatar&#38236;&#20687;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t236" class="pln"><span class="n"><a href="#t236">236</a></span><span class="t">        <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t237" class="mis show_mis"><span class="n"><a href="#t237">237</a></span><span class="t">            <span class="nam">url</span> <span class="op">=</span> <span class="str">'http://gravatar.loli.net/avatar'</span>&nbsp;</span><span class="r"></span></p>
    <p id="t238" class="mis show_mis"><span class="n"><a href="#t238">238</a></span><span class="t">        <span class="nam">hash</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">avatar_hash</span> <span class="key">or</span> <span class="nam">hashlib</span><span class="op">.</span><span class="nam">md5</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">email</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span><span class="op">)</span><span class="op">.</span><span class="nam">hexdigest</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t239" class="mis show_mis"><span class="n"><a href="#t239">239</a></span><span class="t">        <span class="key">return</span> <span class="str">'{url}/{hash}?s={size}&amp;d={default}&amp;r={rating}'</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">url</span><span class="op">=</span><span class="nam">url</span><span class="op">,</span> <span class="nam">hash</span><span class="op">=</span><span class="nam">hash</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t240" class="pln"><span class="n"><a href="#t240">240</a></span><span class="t">                                                                     <span class="nam">size</span><span class="op">=</span><span class="nam">size</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">default</span><span class="op">,</span> <span class="nam">rating</span><span class="op">=</span><span class="nam">rating</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t241" class="pln"><span class="n"><a href="#t241">241</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t242" class="run"><span class="n"><a href="#t242">242</a></span><span class="t">    <span class="key">def</span> <span class="nam">generate_auth_token</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">expiration</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t243" class="mis show_mis"><span class="n"><a href="#t243">243</a></span><span class="t">        <span class="nam">s</span> <span class="op">=</span> <span class="nam">Serializer</span><span class="op">(</span><span class="nam">current_app</span><span class="op">.</span><span class="nam">config</span><span class="op">[</span><span class="str">'SECRET_KEY'</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t244" class="pln"><span class="n"><a href="#t244">244</a></span><span class="t">                       <span class="nam">expires_in</span><span class="op">=</span><span class="nam">expiration</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t245" class="mis show_mis"><span class="n"><a href="#t245">245</a></span><span class="t">        <span class="key">return</span> <span class="nam">s</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="op">{</span><span class="str">'id'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">}</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">'utf-8'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t246" class="pln"><span class="n"><a href="#t246">246</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t247" class="run"><span class="n"><a href="#t247">247</a></span><span class="t">    <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
    <p id="t248" class="run"><span class="n"><a href="#t248">248</a></span><span class="t">    <span class="key">def</span> <span class="nam">verify_auth_token</span><span class="op">(</span><span class="nam">token</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t249" class="mis show_mis"><span class="n"><a href="#t249">249</a></span><span class="t">        <span class="nam">s</span> <span class="op">=</span> <span class="nam">Serializer</span><span class="op">(</span><span class="nam">current_app</span><span class="op">.</span><span class="nam">config</span><span class="op">[</span><span class="str">'SECRET_KEY'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t250" class="mis show_mis"><span class="n"><a href="#t250">250</a></span><span class="t">        <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t251" class="mis show_mis"><span class="n"><a href="#t251">251</a></span><span class="t">            <span class="nam">data</span> <span class="op">=</span> <span class="nam">s</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">token</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t252" class="mis show_mis"><span class="n"><a href="#t252">252</a></span><span class="t">        <span class="key">except</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t253" class="mis show_mis"><span class="n"><a href="#t253">253</a></span><span class="t">            <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
    <p id="t254" class="mis show_mis"><span class="n"><a href="#t254">254</a></span><span class="t">        <span class="key">return</span> <span class="nam">User</span><span class="op">.</span><span class="nam">query</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">data</span><span class="op">[</span><span class="str">'id'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t255" class="pln"><span class="n"><a href="#t255">255</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t256" class="run"><span class="n"><a href="#t256">256</a></span><span class="t">    <span class="key">def</span> <span class="nam">to_json</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t257" class="mis show_mis"><span class="n"><a href="#t257">257</a></span><span class="t">        <span class="nam">json_user</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
    <p id="t258" class="pln"><span class="n"><a href="#t258">258</a></span><span class="t">            <span class="str">'url'</span><span class="op">:</span> <span class="nam">url_for</span><span class="op">(</span><span class="str">'api.get_user'</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t259" class="pln"><span class="n"><a href="#t259">259</a></span><span class="t">            <span class="str">'username'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">username</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t260" class="pln"><span class="n"><a href="#t260">260</a></span><span class="t">            <span class="str">'member_since'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">member_since</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t261" class="pln"><span class="n"><a href="#t261">261</a></span><span class="t">            <span class="str">'last_seen'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">last_seen</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t262" class="pln"><span class="n"><a href="#t262">262</a></span><span class="t">            <span class="str">'posts_url'</span><span class="op">:</span> <span class="nam">url_for</span><span class="op">(</span><span class="str">'api.get_user_posts'</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t263" class="pln"><span class="n"><a href="#t263">263</a></span><span class="t">            <span class="str">'followed_posts_url'</span><span class="op">:</span> <span class="nam">url_for</span><span class="op">(</span><span class="str">'api.get_user_followed_posts'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t264" class="pln"><span class="n"><a href="#t264">264</a></span><span class="t">                                          <span class="nam">id</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t265" class="pln"><span class="n"><a href="#t265">265</a></span><span class="t">            <span class="str">'post_count'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">posts</span><span class="op">.</span><span class="nam">count</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t266" class="pln"><span class="n"><a href="#t266">266</a></span><span class="t">        <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
    <p id="t267" class="mis show_mis"><span class="n"><a href="#t267">267</a></span><span class="t">        <span class="key">return</span> <span class="nam">json_user</span>&nbsp;</span><span class="r"></span></p>
    <p id="t268" class="pln"><span class="n"><a href="#t268">268</a></span><span class="t">    <span class="com"># def change_email(self, token):</span>&nbsp;</span><span class="r"></span></p>
    <p id="t269" class="pln"><span class="n"><a href="#t269">269</a></span><span class="t">    <span class="com">#     ...</span>&nbsp;</span><span class="r"></span></p>
    <p id="t270" class="pln"><span class="n"><a href="#t270">270</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t271" class="pln"><span class="n"><a href="#t271">271</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t272" class="run"><span class="n"><a href="#t272">272</a></span><span class="t"><span class="key">class</span> <span class="nam">Post</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Model</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t273" class="run"><span class="n"><a href="#t273">273</a></span><span class="t">    <span class="nam">__tablename__</span> <span class="op">=</span> <span class="str">'posts'</span>&nbsp;</span><span class="r"></span></p>
    <p id="t274" class="run"><span class="n"><a href="#t274">274</a></span><span class="t">    <span class="nam">id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">primary_key</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t275" class="run"><span class="n"><a href="#t275">275</a></span><span class="t">    <span class="nam">body</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Text</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t276" class="run"><span class="n"><a href="#t276">276</a></span><span class="t">    <span class="nam">timestamp</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">DateTime</span><span class="op">,</span> <span class="nam">index</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="nam">datetime</span><span class="op">.</span><span class="nam">utcnow</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t277" class="run"><span class="n"><a href="#t277">277</a></span><span class="t">    <span class="nam">author_id</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Integer</span><span class="op">,</span> <span class="nam">db</span><span class="op">.</span><span class="nam">ForeignKey</span><span class="op">(</span><span class="str">'users.id'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t278" class="run"><span class="n"><a href="#t278">278</a></span><span class="t">    <span class="nam">body_html</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">Column</span><span class="op">(</span><span class="nam">db</span><span class="op">.</span><span class="nam">Text</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t279" class="run"><span class="n"><a href="#t279">279</a></span><span class="t">    <span class="nam">comments</span> <span class="op">=</span> <span class="nam">db</span><span class="op">.</span><span class="nam">relationship</span><span class="op">(</span><span class="str">'Comment'</span><span class="op">,</span> <span class="nam">backref</span><span class="op">=</span><span class="str">'post'</span><span class="op">,</span> <span class="nam">lazy</span><span class="op">=</span><span class="str">'dynamic'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t280" class="pln"><span class="n"><a href="#t280">280</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t281" class="run"><span class="n"><a href="#t281">281</a></span><span class="t">    <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
    <p id="t282" class="run"><span class="n"><a href="#t282">282</a></span><span class="t">    <span class="key">def</span> <span class="nam">on_changed_body</span><span class="op">(</span><span class="nam">target</span><span class="op">,</span> <span class="nam">value</span><span class="op">,</span> <span class="nam">oldvalue</span><span class="op">,</span> <span class="nam">initiator</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t283" class="pln"><span class="n"><a href="#t283">283</a></span><span class="t">        <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
    <p id="t284" class="pln"><span class="n"><a href="#t284">284</a></span><span class="t"><span class="str">        &#25226;body&#23383;&#27573;&#20013;&#30340;&#25991;&#26412;&#28210;&#26579;&#25104;HTML&#26684;&#24335;&#65292;&#20445;&#23384;&#21040;body_html&#20013;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t285" class="pln"><span class="n"><a href="#t285">285</a></span><span class="t"><span class="str">        :param target:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t286" class="pln"><span class="n"><a href="#t286">286</a></span><span class="t"><span class="str">        :param value:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t287" class="pln"><span class="n"><a href="#t287">287</a></span><span class="t"><span class="str">        :param oldvalue:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t288" class="pln"><span class="n"><a href="#t288">288</a></span><span class="t"><span class="str">        :param initiator:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t289" class="pln"><span class="n"><a href="#t289">289</a></span><span class="t"><span class="str">        :return:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t290" class="pln"><span class="n"><a href="#t290">290</a></span><span class="t"><span class="str">        """</span>&nbsp;</span><span class="r"></span></p>
    <p id="t291" class="mis show_mis"><span class="n"><a href="#t291">291</a></span><span class="t">        <span class="nam">allowed_tags</span> <span class="op">=</span> <span class="op">[</span><span class="str">'a'</span><span class="op">,</span> <span class="str">'abbr'</span><span class="op">,</span> <span class="str">'acronym'</span><span class="op">,</span> <span class="str">'b'</span><span class="op">,</span> <span class="str">'blockquote'</span><span class="op">,</span> <span class="str">'code'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t292" class="pln"><span class="n"><a href="#t292">292</a></span><span class="t">                        <span class="str">'em'</span><span class="op">,</span> <span class="str">'i'</span><span class="op">,</span> <span class="str">'li'</span><span class="op">,</span> <span class="str">'ol'</span><span class="op">,</span> <span class="str">'pre'</span><span class="op">,</span> <span class="str">'strong'</span><span class="op">,</span> <span class="str">'ul'</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t293" class="pln"><span class="n"><a href="#t293">293</a></span><span class="t">                        <span class="str">'h1'</span><span class="op">,</span> <span class="str">'h2'</span><span class="op">,</span> <span class="str">'h3'</span><span class="op">,</span> <span class="str">'p'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
    <p id="t294" class="mis show_mis"><span class="n"><a href="#t294">294</a></span><span class="t">        <span class="nam">target</span><span class="op">.</span><span class="nam">body_html</span> <span class="op">=</span> <span class="nam">bleach</span><span class="op">.</span><span class="nam">linkify</span><span class="op">(</span><span class="nam">bleach</span><span class="op">.</span><span class="nam">clean</span><span class="op">(</span>  <span class="com"># markdown&#36716;&#25442;&#25104;html</span>&nbsp;</span><span class="r"></span></p>
    <p id="t295" class="pln"><span class="n"><a href="#t295">295</a></span><span class="t">            <span class="nam">markdown</span><span class="op">(</span><span class="nam">value</span><span class="op">,</span> <span class="nam">output_format</span><span class="op">=</span><span class="str">'html'</span><span class="op">)</span><span class="op">,</span>       <span class="com"># clean&#20989;&#25968;&#21024;&#38500;&#19981;&#22312;&#30333;&#21517;&#21333;&#20013;&#30340;&#26631;&#31614;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t296" class="pln"><span class="n"><a href="#t296">296</a></span><span class="t">            <span class="nam">tags</span><span class="op">=</span><span class="nam">allowed_tags</span><span class="op">,</span> <span class="nam">strip</span><span class="op">=</span><span class="key">True</span><span class="op">)</span><span class="op">)</span>              <span class="com"># linkfy&#23558;&#32431;&#25991;&#26412;&#30340;URL&#36716;&#25442;&#25104;&lt;a>&#38142;&#25509;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t297" class="pln"><span class="n"><a href="#t297">297</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t298" class="run"><span class="n"><a href="#t298">298</a></span><span class="t">    <span class="key">def</span> <span class="nam">to_json</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t299" class="mis show_mis"><span class="n"><a href="#t299">299</a></span><span class="t">        <span class="nam">json_post</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
    <p id="t300" class="pln"><span class="n"><a href="#t300">300</a></span><span class="t">            <span class="str">'url'</span><span class="op">:</span> <span class="nam">url_for</span><span class="op">(</span><span class="str">'api.get_post'</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t301" class="pln"><span class="n"><a href="#t301">301</a></span><span class="t">            <span class="str">'body'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">body</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t302" class="pln"><span class="n"><a href="#t302">302</a></span><span class="t">            <span class="str">'body_html'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">body_html</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t303" class="pln"><span class="n"><a href="#t303">303</a></span><span class="t">            <span class="str">'timestamp'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">timestamp</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t304" class="pln"><span class="n"><a href="#t304">304</a></span><span class="t">            <span class="str">'author_url'</span><span class="op">:</span> <span class="nam">url_for</span><span class="op">(</span><span class="str">'api.get_user'</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">author_id</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t305" class="pln"><span class="n"><a href="#t305">305</a></span><span class="t">            <span class="str">'comments_url'</span><span class="op">:</span> <span class="nam">url_for</span><span class="op">(</span><span class="str">'api.get_post_comments'</span><span class="op">,</span> <span class="nam">id</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">id</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
    <p id="t306" class="pln"><span class="n"><a href="#t306">306</a></span><span class="t">            <span class="str">'comment_count'</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">comments</span><span class="op">.</span><span class="nam">count</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t307" class="pln"><span class="n"><a href="#t307">307</a></span><span class="t">        <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
    <p id="t308" class="mis show_mis"><span class="n"><a href="#t308">308</a></span><span class="t">        <span class="key">return</span> <span class="nam">json_post</span>&nbsp;</span><span class="r"></span></p>
    <p id="t309" class="pln"><span class="n"><a href="#t309">309</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t310" class="run"><span class="n"><a href="#t310">310</a></span><span class="t">    <span class="op">@</span><span class="nam">staticmethod</span>&nbsp;</span><span class="r"></span></p>
    <p id="t311" class="run"><span class="n"><a href="#t311">311</a></span><span class="t">    <span class="key">def</span> <span class="nam">from_json</span><span class="op">(</span><span class="nam">json_post</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t312" class="mis show_mis"><span class="n"><a href="#t312">312</a></span><span class="t">        <span class="nam">body</span> <span class="op">=</span> <span class="nam">json_post</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'body'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t313" class="mis show_mis"><span class="n"><a href="#t313">313</a></span><span class="t">        <span class="key">if</span> <span class="nam">body</span> <span class="key">is</span> <span class="key">None</span> <span class="key">or</span> <span class="nam">body</span> <span class="op">==</span> <span class="str">''</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t314" class="mis show_mis"><span class="n"><a href="#t314">314</a></span><span class="t">            <span class="key">raise</span> <span class="nam">ValidationError</span><span class="op">(</span><span class="str">'post does not have a body'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t315" class="mis show_mis"><span class="n"><a href="#t315">315</a></span><span class="t">        <span class="key">return</span> <span class="nam">Post</span><span class="op">(</span><span class="nam">body</span><span class="op">=</span><span class="nam">body</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t316" class="pln"><span class="n"><a href="#t316">316</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t317" class="pln"><span class="n"><a href="#t317">317</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t318" class="run"><span class="n"><a href="#t318">318</a></span><span class="t"><span class="key">class</span> <span class="nam">AnonymousUser</span><span class="op">(</span><span class="nam">AnonymousUserMixin</span><span class="op">)</span><span class="op">:</span>  <span class="com"># &#29992;&#25143;&#26410;&#30331;&#24405;&#26102;current_user&#30340;&#20540;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t319" class="run"><span class="n"><a href="#t319">319</a></span><span class="t">    <span class="key">def</span> <span class="nam">can</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">permissions</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t320" class="run"><span class="n"><a href="#t320">320</a></span><span class="t">        <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
    <p id="t321" class="pln"><span class="n"><a href="#t321">321</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t322" class="run"><span class="n"><a href="#t322">322</a></span><span class="t">    <span class="key">def</span> <span class="nam">is_administrator</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
    <p id="t323" class="mis show_mis"><span class="n"><a href="#t323">323</a></span><span class="t">        <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
    <p id="t324" class="pln"><span class="n"><a href="#t324">324</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t325" class="pln"><span class="n"><a href="#t325">325</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t326" class="run"><span class="n"><a href="#t326">326</a></span><span class="t"><span class="nam">login_manager</span><span class="op">.</span><span class="nam">anonymous_user</span> <span class="op">=</span> <span class="nam">AnonymousUser</span>&nbsp;</span><span class="r"></span></p>
    <p id="t327" class="pln"><span class="n"><a href="#t327">327</a></span><span class="t"><span class="com"># SQLAlchemy&#8220;set&#8221;&#20107;&#20214;&#30340;&#30417;&#21548;&#31243;&#24207;&#65292;&#21482;&#35201;body&#23383;&#27573;&#35774;&#32622;&#20102;&#26032;&#20540;&#65292;&#20989;&#25968;&#23601;&#20250;&#33258;&#21160;&#34987;&#35843;&#29992;</span>&nbsp;</span><span class="r"></span></p>
    <p id="t328" class="run"><span class="n"><a href="#t328">328</a></span><span class="t"><span class="nam">db</span><span class="op">.</span><span class="nam">event</span><span class="op">.</span><span class="nam">listen</span><span class="op">(</span><span class="nam">Post</span><span class="op">.</span><span class="nam">body</span><span class="op">,</span> <span class="str">'set'</span><span class="op">,</span> <span class="nam">Post</span><span class="op">.</span><span class="nam">on_changed_body</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t329" class="run"><span class="n"><a href="#t329">329</a></span><span class="t"><span class="nam">db</span><span class="op">.</span><span class="nam">event</span><span class="op">.</span><span class="nam">listen</span><span class="op">(</span><span class="nam">Comment</span><span class="op">.</span><span class="nam">body</span><span class="op">,</span> <span class="str">'set'</span><span class="op">,</span> <span class="nam">Comment</span><span class="op">.</span><span class="nam">on_changed_body</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
    <p id="t330" class="pln"><span class="n"><a href="#t330">330</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t331" class="pln"><span class="n"><a href="#t331">331</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
    <p id="t332" class="pln"><span class="n"><a href="#t332">332</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
</div>
<div id="footer">
    <div class="content">
        <p>
            <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v5.5</a>,
            created at 2021-04-16 21:19 +0800
        </p>
    </div>
</div>
</body>
</html>
